#ifndef HCCL_MEM_STORE_H_
#define HCCL_MEM_STORE_H_
#include <cstdint>
#include "hccl_types.h"


struct MemoryRegion {
    void* addr;   // 内存起始地址
    size_t size;  // 内存区域大小
    
    MemoryRegion(void* a = nullptr, size_t s = 0) : addr(a), size(s) {}
    
    /**
     * @brief 检查指定地址和大小是否在当前内存区域内
     * @param check_addr 要检查的地址
     * @param check_size 要检查的大小
     * @return 是否包含在内
     */
    bool Contains(void* check_addr, size_t check_size) const {
      if (addr == nullptr || check_addr == nullptr) return false;
      uintptr_t region_start = reinterpret_cast<uintptr_t>(addr);
      uintptr_t region_end = region_start + size;
      uintptr_t check_start = reinterpret_cast<uintptr_t>(check_addr);
      uintptr_t check_end = check_start + check_size;
      return (check_start >= region_start) && (region_end >= check_end);
    }
  };


/**
 * @brief 内存存储管理类
 * 
 * 负责管理Server和Client端注册的内存区域，提供内存访问验证功能，与client绑定，作为client的成员变量，一个Client有一个memstore对象，用于记录client侧的endpoint分配的内存地址和sever侧分配的内存地址。channel销毁后，销毁memstore
 */
class ASCEND_FUNC_VISIBILITY HixlMemStore {
 public:
  HixlMemStore();
  ~HixlMemStore();

    /**
   * @brief 给client的endpoint分配内存时，登记Client端分配的内存区域
   * @param addr 要注册的内存起始地址
   * @param size 要注册的内存区域大小
   * @return 操作结果
   */
  HcclResult RegisterClientMemory( void* addr, size_t size);

  /**
   * @brief client与Server建链后，登记Server端内存区域
   * @param addr 要注册的内存起始地址
   * @param size 要注册的内存区域大小
   * @return 操作结果
   */
  HcclResult RegisterServerMemory( void* addr, size_t size);
  
  
  /**
   * @brief channel销毁后，注销Server端已经注册的内存区域
   * @return 操作结果
   */
  HcclResult UnregisterServerMemory();


    /**
   * @brief channel注销给endpoint分配的内存时，注销memstore
   * @return 操作结果
   */
  HcclResult UnregisterClientMemory();
  
  
  /**
   * @brief 验证Client对Server的内存访问请求是否在注册范围内
   * @param server_addr 请求访问的Server端内存地址
   * @param server_size 请求访问的Server端内存大小
   * @param client_addr 发起请求的Client端内存地址
   * @param client_size 发起请求的Client端内存大小
   * @return 验证结果
   */
  HcclResult ValidateMemoryAccess(void* server_addr, size_t server_size, 
                                 void* client_addr, size_t client_size);

 private:
  // 内存区域信息结构体
  MemoryRegion server_region_;
  MemoryRegion client_region_;

  // 禁用拷贝构造和赋值操作
  HixlMemStore(const HixlMemStore&) = delete;
  HixlMemStore& operator=(const HixlMemStore&) = delete;
};

#endif  // HCCL_MEM_STORE_H_
